//
//  XQProtocol.swift
//  ReviewSwift
//
//  Created by ladystyle100 on 2017/8/25.
//  Copyright © 2017年 WangXQ. All rights reserved.
//

import UIKit

protocol BaseProtocol {
    
    /** 声明变量 */
    var number: Int {get}
    
    func run()
    func smile()
    
}

/** 扩展协议 */
extension BaseProtocol {
    /** 可加计算属性 */
    var number: Int {
        get {
            return 1
        }
    }
    
    /** 在扩展中增加的方法, 是不用在遵守的, 但是可以直接用 */
    func sleep(_ name: String) {
        print("\(name) in sleep")
        // 调用自己的方法
        self.run()
    }
    
    /** 默认实现协议方法, 这样实现后, 这个方法也变成可选实现了 */
    func smile() {
        print("默认实现 smile")
    }
    
}

/** 添加可选择不实现 */
@objc protocol OptionProtocol {
    @objc optional func run()
}

/** 在延展中实现protocol, 这样在实例中就可以省略实现协议了 */
extension UIViewController: BaseProtocol {
    var a: Int {
        get {
            return 1
        }
    }
    
    func run() {
        print("run")
        
        var a = XQEquatable()
        let b = XQEquatable()
        a.number = 2
        b.number = 3
        
        /** 重写, 比较函数 */
        print(a == b)
        print(a > b)
        print(a < b)
        print(a >= b)
        print(a <= b)
        
        /** 重写打印 */
        print(a)
        debugPrint(a)
        
        /** 添加 */
        a = a + b
        print(a.number)
    }
    
}

/** 系统特殊协议
 *  Equatable 可以写 == 函数判断两个类是否相等
 *  Comparable 比较两个类, 大于小于等于(遵守这个协议的同时, 必须遵守Equatable协议)
 *  CustomStringConvertible print打印信息
 *  CustomDebugStringConvertible debugPrint打印信息
 */
class XQEquatable: Equatable, Comparable, CustomStringConvertible, CustomDebugStringConvertible {
    var number = 0
    
    /** 两个类相互比较 */
    static func ==(lhs: XQEquatable, rhs: XQEquatable) -> Bool {
        return lhs.number == rhs.number
    }
    
    static func >(lhs: XQEquatable, rhs: XQEquatable) -> Bool {
        return lhs.number > rhs.number
    }
    
    static func <=(lhs: XQEquatable, rhs: XQEquatable) -> Bool {
        return lhs.number <= rhs.number
    }
    
    static func >=(lhs: XQEquatable, rhs: XQEquatable) -> Bool {
        return lhs.number >= rhs.number
    }
    
    static func <(lhs: XQEquatable, rhs: XQEquatable) -> Bool {
        return lhs.number < rhs.number
    }
    
    static func +(lhs: XQEquatable, rhs: XQEquatable) -> XQEquatable {
        lhs.number += rhs.number
        return lhs
    }
    
    // 自定义打印信息
    var description: String {
        return "XQEquatable description"
    }
    
    // 自定义debug打印信息
    var debugDescription: String {
        return "XQEquatable debugDescription"
    }
    
}












